/**
 *
 * @author Kenneth
 * Clase que realiza las operaciones en la Base de Datos para el modulo de autenticacion
 */

package capadatos;

import sistemaamd.ServiceResult;
import sistemaamd.ConstantesSP;

import java.util.ArrayList;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.ResultSet;
import java.sql.SQLException;
import sistemaamd.Usuario;

public class ModuloAutenticacionCapaDatos {

    //instancia del manejador
    private ManejadorBaseDatos manejadorBaseDatos;

    public ModuloAutenticacionCapaDatos() {
        //se inicializa la instancia del manejador
        this.manejadorBaseDatos = new ManejadorBaseDatos();
    }

    /**
     * obtiene el estado de error del manejador
     * @return
     */
    public Boolean getExisteError() {
        return this.manejadorBaseDatos.getExisteError();
    }

    /**
     * obtiene el mensaje de error del manejador
     * @return
     */
    public String getMensajeError() {
        return this.manejadorBaseDatos.getDescripcionError();
    }

    //Consulta para autenticar usuario de la BD haciendo consulta con SP
    public ServiceResult autenticarUsuario(String correo, String clave) {
        ServiceResult resultado;
        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_NOMBRE_AUTENTICAR_USUARIO);
            calls.setString(ConstantesSP.PARAM_AUTENTICAR_USUARIO_EMAIL, correo);
            calls.setString(ConstantesSP.PARAM_AUTENTICAR_USUARIO_PASSWORD, clave);
            calls.registerOutParameter(ConstantesSP.RETURN_AUTENTICAR_USUARIO_ID, Types.INTEGER);
            calls.registerOutParameter(ConstantesSP.RETURN_AUTENTICAR_USUARIO_NOMBRE, Types.VARCHAR);
            calls.registerOutParameter(ConstantesSP.RETURN_AUTENTICAR_USUARIO_TELEFONO, Types.VARCHAR);
            calls.registerOutParameter(ConstantesSP.RETURN_AUTENTICAR_USUARIO_FAX, Types.VARCHAR);
            calls.registerOutParameter(ConstantesSP.RETURN_AUTENTICAR_USUARIO_TIPO_USUARIO, Types.VARCHAR);
            calls.registerOutParameter(ConstantesSP.RETURN_AUTENTICAR_USUARIO_NOMBRE_ORGANIZACION, Types.VARCHAR);
            calls.execute();

            String nombre,tel,fax,tipo,organizacion;
            int id=calls.getInt(ConstantesSP.RETURN_AUTENTICAR_USUARIO_ID);
            nombre = calls.getString(ConstantesSP.RETURN_AUTENTICAR_USUARIO_NOMBRE);
            tipo = calls.getString(ConstantesSP.RETURN_AUTENTICAR_USUARIO_TIPO_USUARIO);
            organizacion = calls.getString(ConstantesSP.RETURN_AUTENTICAR_USUARIO_NOMBRE_ORGANIZACION);
            tel = calls.getString(ConstantesSP.RETURN_AUTENTICAR_USUARIO_TELEFONO);
            fax = calls.getString(ConstantesSP.RETURN_AUTENTICAR_USUARIO_FAX);
            if (nombre==null)
                resultado = new ServiceResult("ERROR: No existe ese usuario con esa contraseña. " + this.manejadorBaseDatos.getDescripcionError());
            else {
                ArrayList valorResultado = new ArrayList();
                Usuario usuario=new Usuario(id,nombre,tipo,organizacion,tel,correo,fax);
                valorResultado.add(usuario);
                resultado.setValorResultado(valorResultado);
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para autenticar usuario de la BD haciendo consulta aqui
    public ServiceResult validarUsuario(String correo, String clave) {
        ServiceResult resultado;
        String query;
        //variable del resultado final
        resultado = new ServiceResult();

        //consulta SQL
        query = "SELECT U.Nombre " +
                "FROM Usuario AS U " +
                "WHERE U.Email='"+correo+"' AND U.Password='"+clave+"'";

        //si se logra ejecutar la consulta satisfactoriamente
        if(this.manejadorBaseDatos.cargarConsulta(query)) {
            //se obtiene el valor del resultado del manejador
            ArrayList valorResultado = this.manejadorBaseDatos.getValorResultado();
            //y se establece el mismo a la variable del resultado final
            resultado.setValorResultado(valorResultado);
        }
        else {
            //si hubo error, retorna un resultado con un mensaje de error
            resultado = new ServiceResult("Error al validar usuario: " + this.manejadorBaseDatos.getDescripcionError());
        }
        return resultado;
    }

}
